;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 通用的汇编函数举例

;;
; \brief	死循环判断0xf8寄存器的bit1是否被清除成功
;			函数名_user_config_wait
; \param	无
; \details
; valotile char *a = (char *)0xf8;
; char bits = 1;
; while (bits) {
;	bits = *a & 0x01;
; }
; return 0;
;;

; 汇编和C语言中的函数可以相互调用，汇编中调用C函数，在函数名前加上下划线_，
; C语言中调用汇编函数，去掉标号名前面的下划线；所以为了函数能相互使用，汇编中
; 的标号使用前面下划线+小写标号名的方式。
; 例如如果C语言中调用这个函数的话，使用wait_reg_ok()，如果是调用汇编的宏定义函数，
; 还可以传入参数，但是这里不能传入参数。
_user_config_wait:
	PUSH	ACC			; 先压栈ACC，因为等会会用A寄存器
_user_config_wait_loop:
	NOP4				; 循环时延时用
	MOV A, USER_MODE	; 读F8私有寄存器 char a = *((char *)0xf8);
	ANL A, #01H			; a &= 0x01
	JNZ _user_config_wait_loop	; A累加器为真则跳转，如果已经为0则继续向下执行退出
	NOP					; 习惯性延时一个滴答
	POP ACC				; 压栈之后要弹栈，C语言中堆栈的处理编译器已经帮你做了
	RET					; 函数返回
	NOP					; 习惯性延时一个滴答，实际上执行不到这里

;;
; \brief 死循环判断0xf8寄存器的bit2是否被设置成功
; \param 无
;;
_user_config_occupy:
	PUSH ACC			; 把等会要用到的A寄存器先压栈
	MOV  A, USER_MODE	; 读F8私有寄存器 char a = *((char *)0xf8);
	ORL  A, #02H		; a |= 0x02, 这是要设置到寄存器里面的值，其它原有的bit保持不变
	MOV  USER_MODE, A	; 写F8寄存器
_user_config_occupy_loop:
	NOP4				; 循环时的延时
	MOV  A, USER_MODE	; 读寄存器
	ANL  A, #02H		; a &= 0x02
	JZ   _user_config_occupy_loop	; 如果A寄存器为0则跳转
	NOP
	POP ACC
	RET
	NOP

;;
; 声明函数，让C语言源码中也能调用汇编的函数，效果类似与：
; extern void user_config_wait(void);
; extern void user_config_occupy(void);
PUBLIC _user_config_wait
PUBLIC _user_config_occupy
